package cn.net.wanji.mapper;

import cn.net.wanji.entity.*;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 监控相关mapper
 *
 * @author weining
 */
@Mapper
public interface MonitorMapper {

    /**
     * 查询所有的事件类
     *
     * @param date 时间
     * @return 事件列表
     */
    CarNum selectCarNumber(@Param("date") String date, @Param("erId") String erId);

    /**
     * 查询当天各个时段的数据
     */
    List<HourNum> getTrafficTrends(@Param("date") String date);

    /**
     * 查询所有的事件类
     *
     * @param nowDate 时间
     * @return 事件列表
     */
    List<EventCar> selectEventByDate(@Param("nowDate") String nowDate, @Param("time") String time);

    /**
     * 查询所有的两客一危车辆
     *
     * @param date 时间
     * @return 两客一危列表
     */
    List<SpecialCar> selectSpecialByDate(@Param("date") String date);

    /**
     * 查询所有未处理的车辆
     *
     * @return 两客一危列表
     */
    List<EventCar> getAllOptionCar();

    /**
     * 查询门架信息
     *
     * @return 门架
     */
    List<Gantry> getAllGantry();

    /**
     * 事件
     */
    void insertEvent(@Param("eventCar") EventCar eventCar);

    /**
     * 根据事件类型和erId获取到门架数据
     *
     * @param carId 车辆id
     * @param erId  门架id
     * @return 事件车辆
     */
    EventCar selectEventByCarIdAndErId(String carId, String erId);

    /**
     * 根据事件类型和erId获取到门架数据
     *
     * @param carId 车辆唯一id
     * @return 事件车辆
     */
    EventCar selectEventByCarId(String carId, String type);

    /**
     * 根据事件类型和erId获取到门架数据
     *
     * @param carId 车辆唯一id
     * @return 事件车辆
     */
    Integer selectEventCountByCarId(String carId, String type);

    /**
     * 根据事件类型和erId获取到门架数据
     *
     * @return 事件车辆
     */
    List<EventCar> selectAllEventTime(@Param("date") String date, @Param("time") String time);

    List<EventCar> selectEventInfoByCarId(@Param("carId") String carId);
    void updateEventInfoByCarId(@Param("eventCar") EventCar eventCar);

    List<EventCar> selectEventInfoByCarIdAndEventType(@Param("carId") String carId, @Param("eventType") String eventType);

    VehicleRsuInfo selectVehicleInfoByRecordId(@Param("recordId") String recordId);

    List<VehicleRsuInfo> selectVehicleInfoByTime(@Param("startTime") String startTime, @Param("endTime") String endTime);
    List<VehicleRsuInfo> selectVehicleInfoDownByTime(@Param("startTime") String startTime, @Param("endTime") String endTime);
    List<VehicleRsuInfo> selectVehicleInfoDownByDetectTimeAndLicenseCode(@Param("vehicleRsuInfo") VehicleRsuInfo vehicleRsuInfo);
    List<VehicleRsuInfo> selectVehicleInfoUpByTime(@Param("startTime") String startTime, @Param("endTime") String endTime);

    List<EventCar> selectFirstEventTime(@Param("gantryId") String gantryId,
                                        @Param("date") String date,
                                        @Param("type") String type,
                                        @Param("time") String time);

    void deleteEventByRecordCarId(String recordCarId);

    List<EventCar> selectAllDownEventByDownGantryId(@Param("gantryId") String gantryId);

    List<EventCar> selectEventByEventParam(EventParam eventParam);

    List<CrossCar> selectCrossDataByEventParam(CrossingDataParam crossingDataParam);

    List<TimeTypeNum> selectCrossDataTypeByHour(CrossingDataParam crossingDataParam);

    List<TimeTypeNum> selectCrossDataTypeByDay(CrossingDataParam crossingDataParam);

    List<TimeTypeNum> selectEventDataTypeByHour(CrossingDataParam crossingDataParam);

    List<TimeTypeNum> selectEventDataTypeByDay(CrossingDataParam crossingDataParam);

    List<TimeTypeNum> selectCarTypeNumber(CrossingDataParam crossingDataParam);

    List<TimeTypeNum> selectEventTypeNumber(CrossingDataParam crossingDataParam);

    List<AntennaInfo> selectAntennaInfo();

    /**
     * 查询一段时间内拥堵数据车辆列表
     *
     * @return 车辆通过列表
     */
    List<CongestionVehicle> selectCongestionVehicleList(CongestionDataParam congestionDataParam);

    List<CongestionVehicle> selectCongestionVehicleDriveList(CongestionDataParam congestionDataParam);

    void updateEventInfo();

}
